package com.xs.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.xs.bean.UserBean;
import com.xs.service.MajorService;
import com.xs.service.UserService;
import com.xs.serviceimpl.MajorServiceImpl;
import com.xs.serviceimpl.UserServiceImpl;

@WebServlet("/UserServlet")
public class UserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	MajorService ms;
	UserService us;

	// 无参构造
	public UserServlet() {
		ms = new MajorServiceImpl();
		us = new UserServiceImpl();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 设置请求跟相应的编码
		request.setCharacterEncoding("Utf-8");
		response.setCharacterEncoding("Utf-8");

		// 从login页面hidden隐藏域得到name="method"参数,通过if判断将要实现什么功能
		String method = request.getParameter("method");

		// 注册功能
		if ("register".equals(method)) {

		}

		// 七天免登陆功能
		if ("noLogin".equals(method)) {
			this.noLogin(request, response);
		}

		// 登录功能
		if ("login".equals(method)) {
			this.login(request, response);
		}

	}

	// 七天免登陆封装方法
	protected void noLogin(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 请求得到浏览器所有所携带的cookie值,并判断该值是否为null,为null转login页面,不为空则进行下一步判断
		Cookie[] cs = request.getCookies();
		if (cs != null) {
			for (int i = 0; i < cs.length; i++) {
				Cookie c = cs[i];
				// 如果能得到cookie值,说明有登录信息
				if ("user".equals(c.getName())) {
					// 获得c的值,即用户和密码,但此时的值是字符串类型,需要拆分
					// 一般情况下不会吧用户信息存到cookie里面,不安全
					String user = c.getValue();
					// 数组接受拆分的值
					String[] str = user.split("#");
					String userName = str[0];
					String userPs = str[1];
					// 将用户和密码传入login()方法进行数据库匹配
					UserBean ub = us.login(userName, userPs);
					// 匹配成功则转发到住页面,即登陆成功
					if (ub != null) {
						// 查询老师们的所有用户
						request.setAttribute("userInfo", us.getUserInfo(2));
						// 获取所有专业
						request.setAttribute("majorInfo", ms.getMajorInfo());
						request.getRequestDispatcher("home.jsp").forward(request, response);
						return;
					}
				}
			}
		}
		// 重新向到登录页面
		response.sendRedirect("login.jsp");
	}

	// 登录功能封装方法
	protected void login(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 从login.jsp得到获得用户跟密码
		String userName = request.getParameter("userName");
		String userPs = request.getParameter("userPs");
		// 通过us调用login()方法拿到用户信息
		UserBean ub = us.login(userName, userPs);
		if (ub != null) { // 登陆成功,即跳转到主页
			// 将用户和密码set并存到session便于sql添加
			request.getSession().setAttribute("ub", ub);
			// 判断是否勾选七天免登陆
			String nologin = request.getParameter("nologin");
			// 判断是否勾选
			if ("7".equals(nologin)) {
				// 每个cookie都是一个名/值对,如果要一次存储多个名/值对，可以使用分号加空格（; ）隔开
				// 这里的"user"键对应的值为字符串"userPs,userName",把user理解为字符串集合,要调取里面的值就同get方法;
				Cookie c = new Cookie("user", userName + "#" + userPs);
				// 设置存活时间
				c.setMaxAge(60 * 60 * 24 * 7);
				// 把c的值用addCookie()方法响应给浏览器,相当于set了一次Cookie
				response.addCookie(c);
			}
			// 查询老师们的所有用户
			request.setAttribute("userInfo", us.getUserInfo(2));
			// 获取所有专业
			request.setAttribute("majorInfo", ms.getMajorInfo());
			// System.out.println("登陆成功");
			request.getRequestDispatcher("home.jsp").forward(request, response);
		} else { // 登陆失败,跳转登录界面
			System.out.println("登陆失败");
			response.sendRedirect("login.jsp");
		}
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// 调用doPost()方法时,执行
		doGet(request, response);

	}
}
